package utils;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;

public class FileUpload {
    private static Logger log=Logger.getLogger(FileUpload.class);

    /**
     * 多部件文件上传（错误信息临时保存在request作用域uploadFileError属性中）
     *
     * @param uploadPath 存放上传文件的目录
     * @param multipartFile 添加页面上传的文件
     * @return 成功返回文件上传地址，返回null表示文件上传失败
     */
    public synchronized static String multipartFileUpload(String uploadPath, MultipartFile multipartFile) {
        String uploadFilePath = null; // 文件上传地址，返回null表示文件上传失败

        // 定义文件存放目录
        log.debug("上传文件路径：" + uploadPath);

        if (!multipartFile.isEmpty()) {
            // 获取上传的文件信息
            String originalFile = multipartFile.getOriginalFilename(); // 原文件名称
            log.debug("原文件名称为：" + originalFile);
            String prefix = FilenameUtils.getExtension(originalFile); // 原文件后缀
            log.debug("原文件后缀为：" + prefix);
            long fileSize = multipartFile.getSize(); // 原文件大小
            log.debug("上传文件大小：" + fileSize);

            // 判断上传的文件是否符合要求
            if (fileSize > Constants.MAX_FILE_SIZE) { // 上传文件大小不能超过500KB
                log.debug(" 上传文件大小不得超过 5MB");
                return uploadFilePath;
            }
            if (prefix != null && !(prefix.equalsIgnoreCase("jpg") || prefix.equalsIgnoreCase("jpeg") || prefix.equalsIgnoreCase("png") || prefix.equalsIgnoreCase("pneg"))) {
                log.debug("  上传文件格式只能是jpg、jpeg、png、pneg");
                return uploadFilePath;
            }

            // 确定文件存储名称
            String fileName = System.nanoTime() + RandomUtils.nextInt(1000) + "_Personal." + prefix;
            log.debug("新生成的文件名为：" + fileName);

            // 将上传的文件保存到目标位置
            File targetFile = new File(uploadPath);
            if (!targetFile.exists()) {
                targetFile.mkdirs(); // 如果目录不存在则生成目录
            }
            // 保存文件
            try {
                // 存储物理地址 + 生成的文件名称
                multipartFile.transferTo(new File(targetFile, fileName));
            } catch (IOException e) {
                e.printStackTrace();
                log.debug("文件上传失败！");
                return uploadFilePath;
            }
            // 文件上传完成就可以拿到地址
            // /statics/upload/98020913201542_Personal.jpg
            uploadFilePath = "/" + Constants.UPLOAD_PATH + "/" + fileName;
        }
        // 返回文件上传成功后的地址，失败时返回null，并且将失败信息记录到
        return uploadFilePath;
    }

    /**
     * 判断文件是否存在
     * @param obj 数据库存储的文件地址
     * @param session
     * @return 存在就返回原来的地址，不存在就返回null
     */
    public static Object existsPath(Object obj, HttpSession session){
        if (obj==null){
            return null;
        }
        String path = session.getServletContext().getRealPath((String) obj);
        File fileIdPic=new File(path);
        if(!fileIdPic.exists()){
            return null;
        }
        return obj;
    }
}
